import axios from "axios"
import { Base64 } from 'js-base64'

import {ElMessageBox} from 'element-plus'

// 创建通用的axios配置
let $http = axios.create({
    baseURL: process.env.VUE_APP_API_URL,
    responseType: 'json',
    headers: {
        "Content-Type": "application/json;charset=utf-8"
    }
})

// 对token加密
function base64Token() {
    const token = localStorage.getItem('token')
    const baseEn = Base64.encode(token)
    return 'Basic ' + baseEn
}


// 添加请求拦截器
$http.interceptors.request.use((config) => {
    // 在发送请求之前做些什么
    let token = localStorage.getItem('token')
    if(token) {
        config.headers = config.headers || {}
        config.headers.Authorization = base64Token()
    }
    
    return config
}, (error) => {
    // 对请求错误做些什么
    return Promise.reject(error)
})

// 添加响应拦截器
$http.interceptors.response.use((response) => {
    // 2xx 范围内的状态码都会触发该函数。
    if(response.status == 200) {
        return response.data
    } else{
       ElMessageBox.alert('请求服务异常', '提示', {
            confirmButtonText: '确定',
            type: 'error',
            showClose: false,
            callback: (action) => {
                // 跳转到登录页面
            },
        }) 
    }
    // // 对响应数据做点什么
    // return response
  }, (error) => {
    if(error.response) {
        let errSt = error.response.status
        let msg = error.response.data.msg
        let errMsg = errSt == 401 ? msg : '服务器错误'
        switch (errSt) {
            case 401: 
                // 没有访问权限、token过期、未登录系统
                ElMessageBox.alert(errMsg, '提示', {
                    // if you want to disable its autofocus
                    // autofocus: false,
                    confirmButtonText: '确定',
                    type: 'error',
                    showClose: false,
                    callback: (action) => {
                        // 跳转到登录页面
                    },
                })
                break;
        
            default:
                break;
        }
    }
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么
    return Promise.reject(error.response.data)
})

export default $http